import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store'
import router from '@/router'
// create an axios instance
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 5000 // request timeout
})
// 定义一个计算token值有效期的时间戳函数
const checkTokenTime = () => {
  // 定义一个当下时间的时间戳
  const currentTime = (new Date()).getTime()
  // 获取登录时存在本地的时间戳
  const loginTime = localStorage.getItem('hr_time_key2')
  // 定义一个token值的有效时间
  const validTime = 1000 * 60 * 60 * 2
  // 返回布尔值：用当下时间戳-登录时获取的时间戳  是否大于 我们设定的token有效时间
  // 如果大于 就返回true  小于  返回false 再根据布尔值来进行事件判断
  return (currentTime - loginTime) > validTime
}
// 请求拦截器
service.interceptors.request.use(config => {
  const token = localStorage.getItem('hr_token2')
  if (token) {
    // 调用token值有效期函数
    if (checkTokenTime()) {
      // 退出并跳转到首页
      // 调用vuex中封装好的退出函数
      store.dispatch('user/logout')
      // 跳转到登录页
      router.push('/login')
      // 告诉浏览器这里除了错误，调用原生对象Error
      return Promise.reject(new Error('token超时'))
    } else {
      config.headers.Authorization = token
    }
  }
  return config
}, err => {
  Message.error(err.message)
  return Promise.reject(err)
})

// 响应拦截器
service.interceptors.response.use(res => {
  // console.log('经过了响应拦截器', res)
  const { data, success, message } = res.data
  // 网络层面的成功
  if (success) {
    // 数据层面的成功
    return data
  } else {
    // 数据层面的失败
    Message.error(message)
    // 这里为什么要使用原生对象Error，因为如果只给一个message，浏览器是不知道有错误的，需要我们用原生错误对象把错误信息给浏览器，然后reject
    return Promise.reject(new Error(message))
  }
}, err => {
  // console.dir(err)
  // token值失效也会导致网络层的错误，会在response.data中返回一个code==10002的，根据这个code来进行判断
  if (err.response && err.response.data && err.response.data.code === 10002) {
    // 退出并跳转
    store.dispatch('user/logout')
    router.push('/login')
  }

  //  网络层面的失败
  Message.error(err.message)
  return Promise.reject(err)
})

export default service
